package com.leetcode.code.problemset;

import com.leetcode.code.pojo.TreeNode;

public class Leetcode654 {
    /**
     *
     * 给定一个不含重复元素的整数数组 nums 。一个以此数组直接递归构建的 最大二叉树 定义如下：
     *
     * 二叉树的根是数组 nums 中的最大元素。
     * 左子树是通过数组中 最大值左边部分 递归构造出的最大二叉树。
     * 右子树是通过数组中 最大值右边部分 递归构造出的最大二叉树。
     * 返回有给定数组 nums 构建的 最大二叉树 。
     *
     * 示例 1：
     * 输入：nums = [3,2,1,6,0,5]
     * 输出：[6,3,5,null,2,0,null,null,1]
     * 解释：递归调用如下所示：
     * - [3,2,1,6,0,5] 中的最大值是 6 ，左边部分是 [3,2,1] ，右边部分是 [0,5] 。
     *     - [3,2,1] 中的最大值是 3 ，左边部分是 [] ，右边部分是 [2,1] 。
     *         - 空数组，无子节点。
     *         - [2,1] 中的最大值是 2 ，左边部分是 [] ，右边部分是 [1] 。
     *             - 空数组，无子节点。
     *             - 只有一个元素，所以子节点是一个值为 1 的节点。
     *     - [0,5] 中的最大值是 5 ，左边部分是 [0] ，右边部分是 [] 。
     *         - 只有一个元素，所以子节点是一个值为 0 的节点。
     *         - 空数组，无子节点。
     *
     * 示例 2：
     * 输入：nums = [3,2,1]
     * 输出：[3,null,2,null,1]
     *
     * 提示：
     * 1 <= nums.length <= 1000
     * 0 <= nums[i] <= 1000
     * nums 中的所有整数 互不相同
     *
     * 来源：力扣（LeetCode）
     * 链接：https://leetcode-cn.com/problems/maximum-binary-tree
     * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
     *
     * 解题思路：https://blog.csdn.net/tcy1429920627/article/details/114004088
     *
     */

    public static TreeNode constructMaximumBinaryTree(int[] nums) {
        return build(nums, 0, nums.length);
    }

    public static TreeNode build(int[] nums, int low, int high) {
        //结束条件
        if(low >= high) {
            return null;
        }

        int index = -1, maxVal = Integer.MIN_VALUE;
        //查找数组给定范围内的最大值
        for(int i=low; i<high; i++) {
            if(maxVal < nums[i]) {
                maxVal = nums[i];
                index = i;
            }
        }

        //最大值作为跟节点
        TreeNode root = new TreeNode(maxVal);
        //递归左子树
        root.left = build(nums, low, index);
        //递归右子树
        root.right = build(nums, index+1, high);
        return root;
    }


    public static void main(String[] args) {
        int[] nums = {3,2,1,6,0,5};
        int[] nums1 = {3,2,1};
        System.out.println(constructMaximumBinaryTree(nums));
        System.out.println(constructMaximumBinaryTree(nums1));

    }
}
